package com.zhn.usermanager.service.impl;

import com.zhn.usermanager.mapper.UserMapper;
import com.zhn.usermanager.pojo.User;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 批量上传
 * @author 16053
 */
@Service
public class ExportExcelServiceImpl {
    @Resource
    private UserMapper userMapper;

    public void exportExcel(String ids, HttpServletResponse response) throws IOException {
        String[] idArray = ids.split(",");
        ArrayList<String> list = new ArrayList<>(Arrays.asList(idArray));

        List<User> userList = userMapper.selectByIds(list);
        System.out.println(userList);

        Workbook workbook = new HSSFWorkbook();                  //  创建2003 excel对象 HSSFWorkbook类型对应2003版本    XSSFWorkbook类型对应2007之后版本
        Sheet sheet = workbook.createSheet("用户信息表");       // 创建第一个sheet（页），并命名，注意这里只创建一页，如果业务需求，可以添加多页

        Font font = workbook.createFont();                       // 创建字体
        font.setFontHeightInPoints((short) 10);                  // 创建字体样式：字体大小
        font.setColor(IndexedColors.BLACK.getIndex());           // 创建字体样式：字体类型(这里设置的是黑体)
        font.setBold(true);                                      // 创建字体样式：粗体

        CellStyle cs = workbook.createCellStyle();               // 创建单元格每列格式对象
        cs.setFont(font);                                        // 把字体样式保存到样式单中
        cs.setBorderLeft(BorderStyle.THIN);                      // 设置具有边框的效果：左边框
        cs.setBorderRight(BorderStyle.THIN);                     // 设置具有边框的效果：右边框
        cs.setBorderTop(BorderStyle.THIN);                       // 设置具有边框的效果：上边框
        cs.setBorderBottom(BorderStyle.THIN);                    // 设置具有边框的效果：下边框
        cs.setAlignment(HorizontalAlignment.CENTER);             // 设置文字居中的效果

        Row row = sheet.createRow(0);
        createCell(0, "用户名", cs, sheet, row);
        createCell(1, "密码", cs, sheet, row);
        createCell(2, "手机号", cs, sheet, row);
        createCell(3, "邮箱", cs, sheet, row);
        createCell(4, "身份证", cs, sheet, row);

        for (int i = 0; i < userList.size(); i++) {               // 设置每行每列的值  Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
            row = sheet.createRow(i + 1);                      // 在当前sheet页上创建一个新行
            User user = userList.get(i);
            createCell(0, user.getUsername(), cs, sheet, row);
            createCell(1, user.getPassword(), cs, sheet, row);
            createCell(2, user.getPhone(), cs, sheet, row);
            createCell(3, user.getEmail(), cs, sheet, row);
            createCell(4, user.getIdCord(), cs, sheet, row);
        }
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Disposition","attachment; filename=" + System.currentTimeMillis() + ".xls");
        //获取响应报文输出流对象
        ServletOutputStream out = response.getOutputStream();
        //输出
        workbook.write(out);
        out.flush();
        out.close();
    }
    public void createCell(int cellNum, String cellValue, CellStyle cs, Sheet sheet, Row row01) {
        sheet.setColumnWidth(cellNum, 256 * 35);            // 设置列宽。第一个参数表示要为第几列，第二个参数表示列的宽度，值为像素值。
        Cell cell01 = row01.createCell(cellNum);               // 在row行上创建一列
        cell01.setCellValue(cellValue);                        // 在此列上写入数据
        cell01.setCellStyle(cs);                              // 在此列上添加样式
    }
}
